package com.wuzhiming.istudy.controller;

import com.alibaba.fastjson.JSONObject;
import com.wuzhiming.istudy.elasticsearch.CourseRespository;
import com.wuzhiming.istudy.pojo.Comment;
import com.wuzhiming.istudy.pojo.Course;
import com.wuzhiming.istudy.pojo.User;
import com.wuzhiming.istudy.utils.LogUtils;
import org.slf4j.Logger;
import org.springframework.web.bind.annotation.*;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

/**
 * @ClassName: AdminController
 * @Description: 管理员控制器
 * @Author:zhimingw
 * @Version 1.0
 * @since 2021/5/30 20:52
 */
@RestController
@RequestMapping("/admin")
public class AdminController extends BaseController{
    private Logger logger = LogUtils.getInstance(AdminController.class);
    /**
     * 修改管理员信息
     */
    @PostMapping("/update")
    public String updateAdmin(User update, String birthdayStr, String flag){
        System.out.println(update);
        update.setId(adminInfo.getId());
        // 修改基本信息
        if ("basic".equals(flag)){
            logger.warn("修改管理员基本信息");
            boolean nameEquals = adminInfo.getName().equals(update.getName());
            boolean addressEquals = adminInfo.getAddress().equals(update.getAddress());
            boolean sexEquals = adminInfo.getSex().equals(update.getSex());
            boolean careerEquals = adminInfo.getCareer().equals(update.getCareer());
            boolean birEquals = new SimpleDateFormat("yyyy年MM月dd日").format(adminInfo.getBirthday()).equals(birthdayStr);

            // 只更新修改过的属性
            update.setName(nameEquals?null:update.getName());
            update.setAddress(addressEquals?null:update.getAddress());
            update.setSex(sexEquals?null:update.getSex());
            update.setCareer(careerEquals?null:update.getCareer());

            try {
                update.setBirthday(birEquals?null:new SimpleDateFormat("yyyy年MM月dd日").parse(birthdayStr));
            } catch (ParseException e) {
                e.printStackTrace();
            }
            if (nameEquals && addressEquals && sexEquals && careerEquals && birEquals){
                result.setCode(501);
                logger.warn("【失败】没有修改任何信息");
                return JSONObject.toJSONString(result);
            }
            List<User> users = userService.queryAll();
            for(int i=0;i<users.size();i++){
                if(users.get(i).getName().equals(update.getName())){
                    result.setCode(502);
                    logger.warn("【失败】已经存在该用户名");
                    return JSONObject.toJSONString(result);
                }
            }
        }
        // 修改联系方式
        if ("contact".equals(flag)){
            logger.warn("修改管理员联系方式");
            boolean emailEquals = adminInfo.getEmail().equals(update.getEmail());
            boolean phoneEquals = adminInfo.getPhone().equals(update.getPhone());
            boolean qqEquals = adminInfo.getQq().equals(update.getQq());
            update.setEmail(emailEquals?null:update.getEmail());
            update.setPhone(phoneEquals?null:update.getPhone());
            update.setQq(qqEquals?null:update.getQq());
            if (emailEquals && phoneEquals && qqEquals){
                result.setCode(501);
                logger.warn("【失败】没有修改任何信息");
                return JSONObject.toJSONString(result);
            }
        }
        // 修改其他信息
        if ("other".equals(flag)){
            logger.warn("修改管理员其他信息");
            if (adminInfo.getInfo().equals(update.getInfo())){
                result.setCode(501);
                logger.warn("【失败】没有修改任何信息");
                return JSONObject.toJSONString(result);
            }
        }
        // 修改资料
        if (userService.update(update)) {
            result.setCode(200);
            logger.warn("【成功】修改管理员资料成功");
            // 更新session
            session.setAttribute("admin",userService.queryById(1));
        }else {
            result.setCode(500);
            logger.warn("【失败】服务器异常");
        }
        return JSONObject.toJSONString(result);
    }


    /**
     * @Description: 修改用户状态
     * @Param: [id]
     * @return: java.lang.String
     * @Author: zhimingw
     * @Date: 2021/7/20
     */
    @GetMapping("/changeUserStatus")
    public String changeUserStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status){
        User user = new User();
        user.setId(id);
        user.setStatus(status);
        System.out.println(user);
        if (userService.update(user)) {
            result.setCode(200);
            logger.warn("【成功】修改用户状态");
        }else {
            result.setCode(500);
            logger.warn("【失败】修改用户状态");
        }
        return JSONObject.toJSONString(result);
    }

    /**
     * 修改管理员信息
     */
    @PostMapping("/userUpdate")
    public String userUpdate(User update){
        update.setId(userInfo.getId());
        // 修改基本信息
        logger.warn("修改用户基本信息");
        boolean nameEquals = userInfo.getName().equals(update.getName());
        boolean addressEquals = false;
        boolean sexEquals = false;
        boolean careerEquals = false;
        if(userInfo.getAddress()!=null){
            addressEquals = userInfo.getAddress().equals(update.getAddress());
        }
        if(userInfo.getSex()!=null){
            sexEquals = userInfo.getSex().equals(update.getSex());
        }
        if(userInfo.getCareer()!=null){
            careerEquals = userInfo.getCareer().equals(update.getCareer());
        }
        // 只更新修改过的属性
        update.setName(nameEquals?null:update.getName());
        update.setAddress(addressEquals?null:update.getAddress());
        update.setSex(sexEquals?null:update.getSex());
        update.setCareer(careerEquals?null:update.getCareer());
        if (nameEquals && addressEquals && sexEquals && careerEquals){
            result.setCode(501);
            logger.warn("【失败】没有修改任何信息");
            return JSONObject.toJSONString(result);
        }
        List<User> users = userService.queryAll();
        for(int i=0;i<users.size();i++){
            if(users.get(i).getName().equals(update.getName())){
                result.setCode(502);
                logger.warn("【失败】已经存在该用户名");
                return JSONObject.toJSONString(result);
            }
        }
        // 修改资料
        if (userService.update(update)) {
            result.setCode(200);
            logger.warn("【成功】修改用户资料成功");
            // 更新session
            session.setAttribute("user",userService.queryById(userInfo.getId()));
        }else {
            result.setCode(500);
            logger.warn("【失败】服务器异常");
        }
        return JSONObject.toJSONString(result);
    }

    /**
     * @Description: 清理并重建ElasticSearch缓存
     * @Param: []
     * @return: java.lang.String
     * @Author: zhimingw
     * @Date: 2021/7/16
     */
    @GetMapping("/resetEs")
    public String resetEs(){
        logger.warn("【ElasticSearch】开始保存课程数据到ES");
        long startTime  = System.currentTimeMillis();
        // 先清空再添加
        courseService.initEs();
        long endTime = System.currentTimeMillis();
        logger.warn("【ElasticSearch】结束保存课程数据到ES，"+"程序运行时间：" + (endTime - startTime) + "ms");
        result.setCode(200);
        result.setData(endTime-startTime);
        return JSONObject.toJSONString(result);
    }
}
